package com.yxx.entityModel.vo.Result;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import static com.yxx.enums.StatusCodeEnum.FAIL;
import static com.yxx.enums.StatusCodeEnum.SUCCESS;

/**
 * 返回响应结果类，用于封装API调用的结果信息，包括状态、状态码、响应消息和响应数据。
 */
@Data
@ApiModel(value = "返回响应结果类", description = "封装API调用的结果信息，包括状态、状态码、响应消息和响应数据")
public class ResponseResult<T> {
    /**
     * 返回状态，true表示成功，false表示失败。
     */
    @ApiModelProperty(value = "返回状态，true表示成功，false表示失败")
    private Boolean flag;

    /**
     * 状态码，用于标识具体的响应状态。
     */
    @ApiModelProperty(value = "状态码，用于标识具体的响应状态")
    private Integer code;

    /**
     * 响应消息，提供关于响应的详细信息。
     */
    @ApiModelProperty(value = "响应消息，提供关于响应的详细信息")
    private String msg;

    /**
     * 响应数据，包含API调用返回的具体数据。
     */
    @ApiModelProperty(value = "响应数据，包含API调用返回的具体数据")
    private T data;


    /**
     * 构建响应结果对象。
     *
     * @param flag    返回状态
     * @param code    状态码
     * @param message 响应消息
     * @param data    响应数据
     * @param <T>     响应数据的类型
     * @return 响应结果对象
     */
    private static <T> ResponseResult<T> buildResult(Boolean flag, Integer code, String message, T data){
        ResponseResult<T> tResponseResult = new ResponseResult<>();
        tResponseResult.setFlag(flag);
        tResponseResult.setData(data);
        tResponseResult.setCode(code);
        tResponseResult.setMsg(message);
        return tResponseResult;
    }

    /**
     * 构建成功的响应结果对象，不包含响应数据。
     *
     * @param <T> 响应数据的类型
     * @return 成功的响应结果对象
     */
    public static <T> ResponseResult<T> success(){
        return buildResult(true, SUCCESS.getCode(), SUCCESS.getMsg(), null);
    }

    /**
     * 构建成功的响应结果对象，包含响应数据。
     *
     * @param data 响应数据
     * @param <T>  响应数据的类型
     * @return 成功的响应结果对象
     */
    public static <T> ResponseResult<T> success(T data){
        return buildResult(true, SUCCESS.getCode(), SUCCESS.getMsg(), data);
    }

    /**
     * 构建失败的响应结果对象，仅包含响应消息。
     *
     * @param message 响应消息
     * @param <T>     响应数据的类型
     * @return 失败的响应结果对象
     */
    public static <T> ResponseResult<T> fail(String message){
        return buildResult(false, FAIL.getCode(),message,null);
    }

    /**
     * 构建失败的响应结果对象，包含状态码和响应消息。
     *
     * @param code    状态码
     * @param message 响应消息
     * @param <T>     响应数据的类型
     * @return 失败的响应结果对象
     */
    public static <T> ResponseResult<T> fail(Integer code, String message){
        return buildResult(false,code,message,null);
    }
}